﻿#region License
//  Distrubted Under the GNU Public License version 2 (GPLv2)
// ========================================
// 
//  QuizzMasterStudio Version 3 
//  Copyright © 2012 , The Sparks (Autism App Jam 2014)
//  All rights reserved.  
// 
// Robert Long, Zephyr Yao, Hillary Chansavang, Li Xiao, Arial Xiao
// 
//  This program is free software: you can redistribute it and/or modify
//  it under the terms of the GNU General Public License as published by
//  the Free Software Foundation, either version 3 of the License, or
//  (at your option) any later version.
//  
//  This program is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//  GNU General Public License for more details.
//  
//  You should have received a copy of the GNU General Public License
//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
//  The full license is also included in the root folder.
// 
// Robert Long
//  Email: rbtLong@live.com
#endregion

using System;
using System.IO;
using System.IO.IsolatedStorage;
using System.Runtime.Serialization;

namespace Core.Persistence
{
    public interface ISerializableItem
    {
        string PersistenceName { get; }
    }

    public static class SerializableExtentionMethods
    {
        public static void Serialize(this ISerializableItem source)
        {
            source.Serialize(source.PersistenceName);
        }

        public static T Deserialize<T>(this ISerializableItem source)
            where T : ISerializableItem
        {
            return (T)source.Deserialize(source.PersistenceName);
        }

        public static void Serialize(this object source, string path)
        {
            var isf = IsolatedStorageFile.GetUserStoreForApplication();
            using (var fs = new IsolatedStorageFileStream(path, FileMode.OpenOrCreate, isf))
            {
                if (ReferenceEquals(source, null))
                    return;

                var ser = new DataContractSerializer(source.GetType());
                ser.WriteObject(fs, source);
            }
        }

        public static object Deserialize(this object source, string path)
        {
            var isf = IsolatedStorageFile.GetUserStoreForApplication();
            if (isf.FileExists(path))
            {
                using (var fs = new IsolatedStorageFileStream(path, FileMode.Open, isf))
                {
                    if (ReferenceEquals(source.GetType(), null))
                        return null;

                    try
                    {
                        var dcSerializer = new DataContractSerializer(source.GetType());
                        return dcSerializer.ReadObject(fs);
                    }
                    catch (Exception)
                    {
                        return null;
                    }
                }
            }
            return null;
        }
    }
}
